package cn.lls.base.result;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 封装返回前端统一结果类
 * @ClassName R
 * @Author 划水艺术家
 * @Date 2022/11/10 0:52
 * @Version 1.0
 **/
@Data
@NoArgsConstructor
@ApiModel("返回前端统计结果类")
public class R<T> {

    public static void main(String[] args) {
        System.out.println(R.success("hah"));
    }

    // 返回状态码
    @ApiModelProperty("返回状态码 200成功，其他均为失败，失败请看 message")
    private Integer code;

    // 返回描述信息
    @ApiModelProperty("返回描述信息，一般在请求失败后此字段才有信息")
    private String message;

    // 返回数据
    @ApiModelProperty("返回数据，泛型")
    private T data;

    /*
    * 操作成功 -- 无数据传回，无描述信息
    * */
    public static<T> R<T> success(){
        return R.success(null);
    }

    /*
     * 操作成功 -- 有数据传回，无描述信息
     * */
    public static<T> R<T> success(T data){
        return build(ResultCode.SUCCESS, null, data);
    }

    /*
     * 操作成功 -- 有数据传回，有描述信息
     * */
    public static<T> R<T> success(T data, String message){
        return build(ResultCode.SUCCESS, message, data);
    }

    /*
     * 操作失败 -- 不指定状态码，无描述信息
     * */
    public static<T> R<T> fail(){
        return R.fail(null);
    }

    /*
     * 操作失败 -- 不指定状态码，有描述信息
     * */
    public static<T> R<T> fail(String message){
        return build(ResultCode.FAIL, message, null);
    }

    /*
     * 操作失败 -- 指定状态码，有描述信息
     * */
    public static<T> R<T> fail(ResultCode resultCode, String message){
        return build(resultCode, message, null);
    }

    /*
     * 操作失败 -- 指定状态码，有描述信息
     * */
    public static<T> R<T> fail(Integer resultCode, String message){
        return build(resultCode, message, null);
    }


    public static<T> R<T> error(ResultCode resultCode){
        return build(resultCode.getCode(), resultCode.getMessage(), null);
    }

    /*
     * 自定义返回数据 - 2种方法重载 传参为 Integer code
     * */
    private static<T> R<T> build(Integer code, String message, T data){
        R<T> result = new R<T>();
        result.setCode(code);
        result.setMessage(message);
        result.setData(data);
        return result;
    }

    /*
     * 自定义返回数据 - 2种方法重载 传参为 ResultCodeEnum resultCodeEnum
     * */
    public static<T> R<T> build(ResultCode resultCodeEnum, String message, T data){
        return build(resultCodeEnum.getCode(), message, data);
    }

}
